using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using ControladorDifuso.Conjunto;

namespace ControladorDifuso.Implicaciones
{
    public class FabricaImplicaciones
    {
        ArrayList lista;

        public object [] Lista
        {
            get
            {
                string[] listaArray = new string[this.lista.Count];
                this.lista.CopyTo(listaArray);
                return listaArray;
            }
        }
        
        public FabricaImplicaciones()
        {
            this.lista = new ArrayList();
            this.lista.Add("Implicacion de Dubois y Prade");
            this.lista.Add("Implicacion de Godel");
            this.lista.Add("Implicacion de Goguen");
            this.lista.Add("Implicacion de Kleene");
            this.lista.Add("Implicacion de Larsen");
            this.lista.Add("Implicacion de Lukasiewicz");
            this.lista.Add("Implicacion de Mamdani");
            this.lista.Add("Implicacion de Reichenbach");
            this.lista.Add("Implicacion de Yager");
            this.lista.Add("Implicacion de Zadeh");
        }

        public Implicacion FabricarImplicacion(string nombre,IPertenencia antecedente,Conjunto.ConjuntoDifuso consecuente)
        {
            switch (nombre)
            {
                case "Implicacion de Dubois y Prade":
                    return new ImplicacionDubois_Prade(antecedente, consecuente);
                case "Implicacion de Godel":
                    return new ImplicacionGodel(antecedente, consecuente);
                case "Implicacion de Goguen":
                    return new ImplicacionGoguen(antecedente, consecuente);
                case "Implicacion de Kleene":
                    return new ImplicacionKleene(antecedente, consecuente);
                case "Implicacion de Larsen":
                    return new ImplicacionLarsen(antecedente, consecuente);
                case "Implicacion de Lukasiewicz":
                    return new ImplicacionLukasiewicz(antecedente, consecuente);
                case "Implicacion de Mamdani":
                    return new ImplicacionMamdani(antecedente, consecuente);
                case "Implicacion de Reichenbach":
                    return new ImplicacionReichenbach(antecedente, consecuente);
                case "Implicacion de Yager":
                    return new ImplicacionYager(antecedente, consecuente);
                case "Implicacion de Zadeh":
                    return new ImplicacionZadeh(antecedente, consecuente);
            }
            return null;
        }
    }
}
